/*
	NounEnhancementShip.cpp
	(c)2008 Palestar Inc, Jeff Everett
*/


#include "Debug/Assert.h"
#include "Constants.h"
#include "NounShip.h"
#include "NounPlanet.h"
#include "StructurePort.h"
#include "GameContext.h"
#include "NounEnhancementShip.h"

// Minor Ship ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_MinorVelocity, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorVelocity, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorVelocity::NounEnhancement_MinorVelocity()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,10));
}

IMPLEMENT_FACTORY( NounEnhancement_MinorThrust, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorThrust, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorThrust::NounEnhancement_MinorThrust()
{
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,10));
}

IMPLEMENT_FACTORY( NounEnhancement_MinorTurn, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorTurn, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorTurn::NounEnhancement_MinorTurn()
{
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,10));
}

IMPLEMENT_FACTORY( NounEnhancement_MinorArmor, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorArmor, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorArmor::NounEnhancement_MinorArmor()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,10));
}

IMPLEMENT_FACTORY( NounEnhancement_MinorShield, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MinorShield, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MinorShield::NounEnhancement_MinorShield()
{
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,10));
}

// Limited Ship ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_LimitedVelocity, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedVelocity, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedVelocity::NounEnhancement_LimitedVelocity()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,20));
}

IMPLEMENT_FACTORY( NounEnhancement_LimitedThrust, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedThrust, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedThrust::NounEnhancement_LimitedThrust()
{
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,20));
}

IMPLEMENT_FACTORY( NounEnhancement_LimitedTurn, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedTurn, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedTurn::NounEnhancement_LimitedTurn()
{
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,20));
}

IMPLEMENT_FACTORY( NounEnhancement_LimitedArmor, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedArmor, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedArmor::NounEnhancement_LimitedArmor()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,20));
}

IMPLEMENT_FACTORY( NounEnhancement_LimitedShield, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_LimitedShield, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_LimitedShield::NounEnhancement_LimitedShield()
{
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,20));
}

// Standard Ship ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_StandardVelocity, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardVelocity, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardVelocity::NounEnhancement_StandardVelocity()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,30));
}

IMPLEMENT_FACTORY( NounEnhancement_StandardThrust, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardThrust, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardThrust::NounEnhancement_StandardThrust()
{
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,30));
}

IMPLEMENT_FACTORY( NounEnhancement_StandardTurn, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardTurn, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardTurn::NounEnhancement_StandardTurn()
{
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,30));
}

IMPLEMENT_FACTORY( NounEnhancement_StandardArmor, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardArmor, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardArmor::NounEnhancement_StandardArmor()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,30));
}

IMPLEMENT_FACTORY( NounEnhancement_StandardShield, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_StandardShield, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_StandardShield::NounEnhancement_StandardShield()
{
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,30));
}

// Improved Ship ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_ImprovedVelocity, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedVelocity, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedVelocity::NounEnhancement_ImprovedVelocity()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,40));
}

IMPLEMENT_FACTORY( NounEnhancement_ImprovedThrust, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedThrust, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedThrust::NounEnhancement_ImprovedThrust()
{
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,40));
}

IMPLEMENT_FACTORY( NounEnhancement_ImprovedTurn, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedTurn, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedTurn::NounEnhancement_ImprovedTurn()
{
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,40));
}

IMPLEMENT_FACTORY( NounEnhancement_ImprovedArmor, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedArmor, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedArmor::NounEnhancement_ImprovedArmor()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,40));
}

IMPLEMENT_FACTORY( NounEnhancement_ImprovedShield, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ImprovedShield, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ImprovedShield::NounEnhancement_ImprovedShield()
{
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,40));
}

// Enhanced Ship ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_EnhancedVelocity, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedVelocity, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedVelocity::NounEnhancement_EnhancedVelocity()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,50));
}

IMPLEMENT_FACTORY( NounEnhancement_EnhancedThrust, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedThrust, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedThrust::NounEnhancement_EnhancedThrust()
{
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,50));
}

IMPLEMENT_FACTORY( NounEnhancement_EnhancedTurn, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedTurn, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedTurn::NounEnhancement_EnhancedTurn()
{
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,50));
}

IMPLEMENT_FACTORY( NounEnhancement_EnhancedArmor, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedArmor, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedArmor::NounEnhancement_EnhancedArmor()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,50));
}

IMPLEMENT_FACTORY( NounEnhancement_EnhancedShield, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_EnhancedShield, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_EnhancedShield::NounEnhancement_EnhancedShield()
{
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,50));
}

// Advanced Ship ---------------------------------------------------------------//
IMPLEMENT_FACTORY( NounEnhancement_AdvancedVelocity, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedVelocity, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedVelocity::NounEnhancement_AdvancedVelocity()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,60));
}

IMPLEMENT_FACTORY( NounEnhancement_AdvancedThrust, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedThrust, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedThrust::NounEnhancement_AdvancedThrust()
{
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,60));
}

IMPLEMENT_FACTORY( NounEnhancement_AdvancedTurn, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedTurn, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedTurn::NounEnhancement_AdvancedTurn()
{
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,60));
}

IMPLEMENT_FACTORY( NounEnhancement_AdvancedArmor, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedArmor, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedArmor::NounEnhancement_AdvancedArmor()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,60));
}

IMPLEMENT_FACTORY( NounEnhancement_AdvancedShield, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_AdvancedShield, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_AdvancedShield::NounEnhancement_AdvancedShield()
{
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,60));
}

IMPLEMENT_FACTORY( NounEnhancement_MakkarShipBooster, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MakkarShipBooster, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MakkarShipBooster::NounEnhancement_MakkarShipBooster()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,50));
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,50));
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,50));
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,-50));
}

IMPLEMENT_FACTORY( NounEnhancement_ShipProtector, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ShipProtector, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ShipProtector::NounEnhancement_ShipProtector()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,50));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,50));
}

IMPLEMENT_FACTORY( NounEnhancement_ShipProtectorTwo, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ShipProtectorTwo, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ShipProtectorTwo::NounEnhancement_ShipProtectorTwo()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,70));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,70));
}

IMPLEMENT_FACTORY( NounEnhancement_ShipProtectorThree, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ShipProtectorThree, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ShipProtectorThree::NounEnhancement_ShipProtectorThree()
{
	m_enhancements.push_back(new Enhancement(ES_DEFENSE,MT_INCREASE,20));
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,70));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,70));
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,50));
	m_enhancements.push_back(new Enhancement(ES_WEAPON,MT_DAMAGE,200));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,200));
}

IMPLEMENT_FACTORY( NounEnhancement_ShipProtectorFour, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ShipProtectorFour, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ShipProtectorFour::NounEnhancement_ShipProtectorFour()
{
	m_enhancements.push_back(new Enhancement(ES_DEFENSE,MT_INCREASE,30));
}
IMPLEMENT_FACTORY( NounEnhancement_ShipProtectorFive, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_ShipProtectorFive, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_ShipProtectorFive::NounEnhancement_ShipProtectorFive()
{
	m_enhancements.push_back(new Enhancement(ES_DEFENSE,MT_INCREASE,40));
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,50));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,50));
}

IMPLEMENT_FACTORY( NounEnhancement_MavericksDefense, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MavericksDefense, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MavericksDefense::NounEnhancement_MavericksDefense()
{
	m_enhancements.push_back(new Enhancement(ES_DEFENSE,MT_INCREASE,1000));
}

IMPLEMENT_FACTORY( NounEnhancement_MaxDefense, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MaxDefense, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MaxDefense::NounEnhancement_MaxDefense()
{
	m_enhancements.push_back(new Enhancement(ES_DEFENSE,MT_INCREASE,5));
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,5));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,5));
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,10));
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,10));
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,5));
	m_enhancements.push_back(new Enhancement(ES_WEAPON,MT_DAMAGE,-20));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-20));
}

IMPLEMENT_FACTORY( NounEnhancement_Reek, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_Reek, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_Reek::NounEnhancement_Reek()
{
	m_enhancements.push_back(new Enhancement(ES_TRAIL,MT_APPLY,TRAIL_GREEN));
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,50));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,-50));
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,60));
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,-30));
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,30));
	m_enhancements.push_back(new Enhancement(ES_WEAPON,MT_DAMAGE,200));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-200));
}

IMPLEMENT_FACTORY( NounEnhancement_lol, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_lol, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_lol::NounEnhancement_lol()
{
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,500));
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,1000));
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,500));
}

IMPLEMENT_FACTORY( NounEnhancement_Nerf, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_Nerf, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_Nerf::NounEnhancement_Nerf()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,-99));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,-99));
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,-99));
	m_enhancements.push_back(new Enhancement(ES_THRUST,MT_INCREASE,-99));
	m_enhancements.push_back(new Enhancement(ES_TURNRATE,MT_INCREASE,-99));
	m_enhancements.push_back(new Enhancement(ES_WEAPON,MT_DAMAGE,-99));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,-99));
}
IMPLEMENT_FACTORY( NounEnhancement_MaxPower, NounEnhancement );
BEGIN_ABSTRACT_PROPERTY_LIST( NounEnhancement_MaxPower, NounEnhancement )
END_PROPERTY_LIST();

NounEnhancement_MaxPower::NounEnhancement_MaxPower()
{
	m_enhancements.push_back(new Enhancement(ES_ARMOR,MT_INCREASE,-80));
	m_enhancements.push_back(new Enhancement(ES_SHIELD,MT_INCREASE,-80));
	m_enhancements.push_back(new Enhancement(ES_VELOCITY,MT_INCREASE,-60));
	m_enhancements.push_back(new Enhancement(ES_WEAPON,MT_DAMAGE,200));
	m_enhancements.push_back(new Enhancement(ES_BEAM,MT_DAMAGE,200));
	m_enhancements.push_back(new Enhancement(ES_SHIPENERGY,MT_REFILL,150));
}